package com.company.project.controller.wx.demo;

import me.chanjar.weixin.common.util.crypto.SHA1;
import me.chanjar.weixin.mp.api.WxMpService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


@RestController()
@RequestMapping("/wxdemo/webjs")
public class WxWebJsSignatureController {

    private final Logger logger = LoggerFactory.getLogger(this.getClass());

    @Autowired
    private WxMpService wxService;

    /***  js-sdk 签名
     * 1.先登录微信公众平台进入“公众号设置”的“功能设置”里填写“JS接口安全域名”。
     * 2.jsapi_ticket的有效期为7200秒
     * 3.签名生成规则如下：参与签名的字段包括noncestr（随机字符串）, 有效的jsapi_ticket, timestamp（时间戳）
     * , url（当前网页的URL，不包含#及其后面部分） 。
     * 对所有待签名参数按照字段名的ASCII 码从小到大排序（字典序）后，
     * 使用URL键值对的格式（即key1=value1&key2=value2…）拼接成字符串string1。
     * 这里需要注意的是所有参数名均为小写字符。
     * 对string1作sha1加密，字段名和字段值都采用原始值，不进行URL 转义。
     * 4.注意事项
     *    1.签名用的noncestr和timestamp必须与wx.config中的nonceStr和timestamp相同。
     *    2.签名用的url必须是调用JS接口页面的完整URL。
     * @param request
     * @param response
     * @throws Exception
     */
    @RequestMapping("signature")
    @ResponseBody
    protected String service(HttpServletRequest request, HttpServletResponse response)
            throws Exception {

        long timestamp = 1419835025l;
        String url = "https://lllwwwbbb.free.ngrok.cc/web/index";
        String noncestr = "82693e11-b9bc-448e-892f-f5289f46cd0f";
        String jsapiTicket = this.wxService.getJsapiTicket(false);
        String signature = SHA1.genWithAmple(
                "jsapi_ticket=" + jsapiTicket,
                "noncestr=" + noncestr,
                "timestamp=" + timestamp,
                "url=" + url
        );
        System.out.println("signature:" + signature);
        return String.format("{signature:%s}", signature);
    }



    /**
     * @param args
     */
    public static void main(String[] args) {

    }


}
